package cn.lcsjsxy.yxz.day.Practice.Reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

// 反射调用构造器创建对象
// 通过反射完成以下内容：
// 调用无参私有构造器，创建 Book 对象并打印。
// 调用有参私有构造器（传入 title="Java 反射实战"，price=59.9），创建对象并打印。
public class Create_object {
    public static void main(String[] args) {
        try {
            // 获取Book类的Class对象
            Class<?> bookClass = Class.forName("cn.lcsjsxy.yxz.day.Practice.Reflection.Book");

            // 1. 调用无参私有构造器
            // 获取无参构造器
            Constructor<?> noArgConstructor = bookClass.getDeclaredConstructor();
            // 设置可访问私有构造器
            noArgConstructor.setAccessible(true);
            // 创建对象
            Object book1 = noArgConstructor.newInstance();
            System.out.println("无参构造器创建的对象: " + book1);

            // 2. 调用有参私有构造器
            // 获取有参构造器（参数类型为String和double）
            Constructor<?> argConstructor = bookClass.getDeclaredConstructor(String.class, double.class);
            // 设置可访问私有构造器
            argConstructor.setAccessible(true);
            // 创建对象并传入参数
            Object book2 = argConstructor.newInstance("Java 反射练习 ", 59.9);
            System.out.println("有参构造器创建的对象: " + book2);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

    }
}
//定义一个 Book 类，仅包含私有构造器：
class Book {
    private String title;
    private double price;

    // 私有无参构造器
    private Book() {
        this.title = "默认书名";
        this.price = 0.0;
    }

    // 私有有参构造器
    private Book(String title, double price) {
        this.title = title;
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{title='" + title + "', price=" + price + "}";
    }
}
